#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_zzh_jnilearn_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}


extern "C" JNIEXPORT void JNICALL
Java_com_zzh_jnilearn_MainActivity_jniSetName(JNIEnv *env, jobject thiz) {
    //反射获取java对象
    jclass mainActvityClass = env->GetObjectClass(thiz);
    // 反射查找java字段名
    // 参数1：反射字段所属的对象
    // 参数2: 反射字段名
    // 参数3：参数类型，不同java参数类型有不同的字符串表示方法，如果是java对象的话则是L+报名+类名的方式表示
    jfieldID fieldId = env->GetFieldID(mainActvityClass, "name", "Ljava/lang/String;");
    jstring cstr = env->NewStringUTF("c++修改了");
    env->SetObjectField(thiz, fieldId, cstr);
}

extern "C" JNIEXPORT void JNICALL
Java_com_zzh_jnilearn_MainActivity_invokeJavaCallback(JNIEnv *env, jobject thiz) {
    //反射获取java对象
    jclass mainActvityClass = env->GetObjectClass(thiz);
    // 反射查找java方法
    // 参数1：反射方法所属的对象
    // 参数2: 反射方法名
    // 参数3：方法签名，描述接收的参数类型和返回的参数类型
    jmethodID methodId = env->GetMethodID(mainActvityClass, "onCallback", "(I)V");
    env->CallVoidMethod(thiz,methodId,2);
}